// admin/system/dao/sys_notice_dao.go
package dao

import (
	"go-admin1/admin/system/model"
	"go-admin1/internal/infrastructure/database"
	"go-admin1/internal/infrastructure/logger"

	"go.uber.org/zap"
	"gorm.io/gorm"
)

// SysNoticeDao 通知公告数据访问接口
type SysNoticeDao interface {
	Create(notice *model.SysNotice) error
	GetByID(id int64) (*model.SysNotice, error)
	Update(notice *model.SysNotice) error
	Delete(id int64) error
	List(page, pageSize int) ([]*model.SysNotice, int64, error)
	ListAll() ([]*model.SysNotice, error)
}

type sysNoticeDao struct {
	db *gorm.DB
}

// NewSysNoticeDao 创建通知公告数据访问实例
func NewSysNoticeDao() SysNoticeDao {
	return &sysNoticeDao{
		db: database.GetDB(),
	}
}

func (n *sysNoticeDao) Create(notice *model.SysNotice) error {
	logger.Info("创建通知公告", zap.Int64("notice_id", notice.NoticeID))
	return n.db.Create(notice).Error
}

func (n *sysNoticeDao) GetByID(id int64) (*model.SysNotice, error) {
	logger.Debug("根据ID获取通知公告", zap.Int64("notice_id", id))
	var notice model.SysNotice
	err := n.db.Where("notice_id = ? AND status = '0'", id).First(&notice).Error
	return &notice, err
}

func (n *sysNoticeDao) Update(notice *model.SysNotice) error {
	logger.Info("更新通知公告", zap.Int64("notice_id", notice.NoticeID))
	return n.db.Save(notice).Error
}

func (n *sysNoticeDao) Delete(id int64) error {
	logger.Info("删除通知公告", zap.Int64("notice_id", id))
	return n.db.Where("notice_id = ?", id).Delete(&model.SysNotice{}).Error
}

func (n *sysNoticeDao) List(page, pageSize int) ([]*model.SysNotice, int64, error) {
	logger.Debug("获取通知公告列表", zap.Int("page", page), zap.Int("page_size", pageSize))
	var notices []*model.SysNotice
	var total int64

	offset := (page - 1) * pageSize
	db := n.db.Model(&model.SysNotice{}).Where("status = '0'")

	if err := db.Count(&total).Error; err != nil {
		return nil, 0, err
	}

	if err := db.Offset(offset).Limit(pageSize).Order("create_time DESC").Find(&notices).Error; err != nil {
		return nil, 0, err
	}

	return notices, total, nil
}

func (n *sysNoticeDao) ListAll() ([]*model.SysNotice, error) {
	logger.Debug("获取所有通知公告列表")
	var notices []*model.SysNotice
	err := n.db.Where("status = '0'").Order("create_time DESC").Find(&notices).Error
	return notices, err
}
